package com.tensai.study.新特性.JDK8.函数式编程;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * lambda表达式用的最多的场合就是替代匿名内部类，实现Runnable接口是匿名内部类的经典例子。
 * <p>
 * lambda表达式的功能相当强大，用()->就可以代替整个匿名内部类！
 */
public class ReplaceOfAnonymousInner {

    public static void main(String[] args) {
        //常规写法 编译器会提示你使用lambda代替
        //把这个提示强关掉
        @SuppressWarnings("all")
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("普通，线程启动");
            }
        };
        runnable.run();
        test2();
        test3();
        test4();
        test5();
    }

    //无参数，无返回值
    private static void test2() {
        //“->”左边只有一个小括号，表示无参数，右边是Lambda体(就相当于实现了匿名内部类里面的方法了，(即就是一个可用的接口实现类了。))
        Runnable runnable = () -> System.out.println("Lambda 表达式方式，线程启动");
        runnable.run();
    }

    //有一个参数，并且无返回值
    private static void test3() {
        //这个e就代表所实现的接口的方法的参数，
        Consumer<String> consumer = e -> System.out.println("Lambda 表达式方式，" + e);
        consumer.accept("传入参数");
    }

    //有两个以上的参数，有返回值，并且 Lambda 体中有多条语句
    private static void test4() {
        //Lambda 体中有多条语句，记得要用大括号括起来
        Comparator<Integer> com = (x, y) -> {
            System.out.println("函数式接口");
            return Integer.compare(x, y);
        };
        int compare = com.compare(100, 244);
        System.out.println("有两个以上的参数，有返回值," + compare);
    }

    //若 Lambda 体中只有一条语句， return 和 大括号都可以省略不写
    private static void test5() {
        Comparator com = Comparator.comparingInt(x -> (int) x);
        System.out.println("若 Lambda 体中只有一条语句， return 和 大括号都可以省略不写," + com);
    }

    /**
     * 方法引用与构造器引用
     * <p>
     * 要求：实现抽象方法的参数列表和返回值类型，必须与方法引用的方法的参数列表和返回值类型保持一致！
     * <p>
     * 方法引用：使用操作符“::”将类与方法分隔开来。
     * <p>
     * 对象::实例方法名
     * 类::静态方法名
     * 类::实例方法名
     */
    public static void test9() {
        @SuppressWarnings("all")
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
        Comparator<Integer> comparator1 = Integer::compare;
        int compare = comparator.compare(1, 2);
        int compare1 = comparator1.compare(1, 2);
        System.out.println("compare:" + compare);
        System.out.println("compare1:" + compare1);
    }

}
